home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2003 November / PCWK1103B.iso / Adobe DVD Encore 1.0 tryout / data1.cab / Help_Files / Help / help.js < prev    next >
Text File  |  2003-08-20  |  39KB  |  1,156 lines

  1. <!--[CDATA[
  2.  
  3. var upperAsciiXlatTbl = new Array(
  4. 223,"ss",
  5. 230,"ae",
  6. 198,"ae",
  7. 156,"oe",
  8. 140,"oe",
  9. 240,"eth",
  10. 208,"eth",
  11. 141,"y",
  12. 159,"y"
  13. );
  14.  
  15. var maxNumberOfShownSearchHits = 100;
  16. var showInputStringAlerts = 0;
  17. var navigationCookie = "";
  18.  
  19. /////////////////////////////// COOKIE-RELATED FUNCTIONS ////////////////////////
  20. // Bill Dortch getCookieVal and GetCookie routines
  21. function getCookieVal(offset) {
  22.   var endstr=document.cookie.indexOf(";",offset);
  23.   if (endstr==-1)endstr=document.cookie.length;
  24.   return unescape(document.cookie.substring(offset, endstr));
  25. }
  26. function GetCookie(name) {
  27.   var arg=name+"=";
  28.   var alen=arg.length;
  29.   var clen=document.cookie.length;
  30.   var i=0;
  31.   while(i<clen){
  32.     var j=i+alen;
  33.     if(document.cookie.substring(i,j)==arg)return getCookieVal(j);
  34.     i=document.cookie.indexOf(" ",i)+1;
  35.     if(i==0)break; 
  36.   }
  37.   return null;
  38. }
  39. function getTopCookieVal(offset) {
  40.   var endstr=top.document.cookie.indexOf(";",offset);
  41.   if (endstr==-1)endstr=top.document.cookie.length;
  42.   return unescape(top.document.cookie.substring(offset, endstr));
  43. }
  44. function GetTopCookie(name) {
  45.   var arg=name+"=";
  46.   var alen=arg.length;
  47.   var clen=top.document.cookie.length;
  48.   var i=0;
  49.   while(i<clen){
  50.     var j=i+alen;
  51.     if(top.document.cookie.substring(i,j)==arg)return getTopCookieVal(j);
  52.     i=top.document.cookie.indexOf(" ",i)+1;
  53.     if(i==0)break; 
  54.   }
  55.   return null;
  56. }
  57. // SetCookie
  58. // -----------
  59. // This function is called to set a cookie in the current document.
  60. //  params:
  61. //        n - name of the cookie
  62. //        v - value of the cookie
  63. //        minutes - the duration of the cookie in minutes (that is, how many minutes before it expires)
  64. function SetCookie(n,v,minutes) {
  65.  var Then = new Date();
  66.  Then.setTime(Then.getTime() + minutes * 60 * 1000);
  67.  document.cookie = n + "=" + v + ";expires=" + Then.toGMTString();
  68. }
  69. // getContentCookie
  70. // ----------------
  71. // This function reads the content cookie set by the handleContext funtion.
  72. //
  73. function getContentCookie()
  74. {
  75.     var contentCookie = GetCookie("content");
  76.     top.document.cookie = "content=";
  77.  
  78.     // What does this expression mean?
  79.     // (contentCookie.indexOf("htm") != -1)
  80.     if ( (contentCookie != null) && (contentCookie.indexOf("htm") != -1) ) 
  81.     {
  82.         document.cookie = "content="; // Wipe out the cookie
  83.         top.document.cookie = "histR=" + contentCookie;
  84.         location.replace(contentCookie);
  85.     }            
  86. }
  87. // getNavigationCookie
  88. // -------------------
  89. // This function reads the content cookie set by the handleContext funtion.
  90. //
  91. function getNavigationCookie()
  92. {
  93.     navigationCookie = GetCookie("navigation");
  94.     top.document.cookie = "navigation=";
  95.  
  96.     // What does this expression mean?
  97.     // (navigationCookie.indexOf("htm") != -1)
  98.     if ( (navigationCookie != null) && (navigationCookie.indexOf("htm") != -1) ) 
  99.     {
  100.         document.cookie = "navigation="; // Wipe out the cookie
  101.         top.document.cookie = "histL=" + navigationCookie;
  102.         location.replace(navigationCookie);
  103.     }
  104.                 
  105. }
  106.  
  107. // handleContext
  108. // -------------
  109. // This function is called from content pages. It sets a cookie as soon
  110. // as the page is loaded. If the content page is not in it's proper place
  111. // in the frameset, the frameset will be loaded and the page will be 
  112. // restored using the value in this cookie.
  113. //
  114. function handleContext(which)
  115. {
  116.     var docLocLastNode = lastNodeOf(document.location);
  117.  
  118.     if( top.frames.length ) {
  119.         
  120.         if( which ) {    // This page is supposed to go into the CONTENT frame
  121.             if( docLocLastNode != lastNodeOf(top.frames["content"].location) ) {    // ...but it is being loaded elsewhere
  122.                 top.location.replace("help.html");
  123.                 top.document.cookie = "content=" + docLocLastNode;
  124.             }
  125.             else {
  126.                 top.document.cookie = "histR=" + docLocLastNode;
  127.             }
  128.         }
  129.         else {            // This page is supposed to go into the NAVIGATION frame
  130.             if( docLocLastNode != lastNodeOf(top.frames["navigation"].location) ) {    // ...but it is being loaded elsewhere
  131.                 top.location.replace("help.html");
  132.                 top.document.cookie = "navigation=" + lastNodeOf(top.frames["content"].history.previous);
  133.             }
  134.             else {
  135.                 top.document.cookie = "histL=" + docLocLastNode;
  136.             }
  137.         }
  138.     }
  139.     else {
  140.         if( which ) {
  141.             top.document.cookie = "navigation=1_0_0_0.html";
  142.             top.document.cookie = "histL=1_0_0_0.html";
  143.             top.document.cookie = "content=" + docLocLastNode;
  144.             top.document.cookie = "histR=" + docLocLastNode;
  145.         }
  146.         else {
  147.             top.document.cookie = "navigation=" + docLocLastNode;
  148.             top.document.cookie = "histL=" + docLocLastNode;
  149.             top.document.cookie = "content=splash.html";
  150.             top.document.cookie = "histR=splash.html";
  151.         }
  152.         top.location.replace("help.html");
  153.     }
  154. }
  155. // lastNodeOf
  156. // ----------
  157. // This function gets passed a URL and returns the last node of same.
  158. function lastNodeOf(e)
  159. {
  160.     var expr = "" + e;
  161.     var pos = expr.lastIndexOf("/");
  162.  
  163.     if( (pos != -1) && (pos+1 != expr.length) ) {
  164.         return expr.substr(pos+1);
  165.     }
  166.     else {
  167.         return expr;
  168.     }
  169. }
  170. // frameBuster
  171. // -----------
  172. // This function is called by the frameset to ensure it's always loaded
  173. // at the top level of the current window.
  174. //
  175. function frameBuster()
  176. {
  177.     var thisLocation = document.location;
  178.     if ( document.location != top.location )
  179.     {
  180.         top.location.replace("help.html");
  181.     }
  182. }
  183.  
  184.  
  185. // SEARCH RELATED.......................................SEARCH RELATED
  186. // SEARCH RELATED.......................................SEARCH RELATED
  187. // SEARCH RELATED.......................................SEARCH RELATED
  188. // SEARCH RELATED.......................................SEARCH RELATED
  189. // SEARCH RELATED.......................................SEARCH RELATED
  190. // SEARCH RELATED.......................................SEARCH RELATED
  191. // SEARCH RELATED.......................................SEARCH RELATED
  192. // SEARCH RELATED.......................................SEARCH RELATED
  193. // SEARCH RELATED.......................................SEARCH RELATED
  194. // SEARCH RELATED.......................................SEARCH RELATED
  195. function bubbleSortWithShadow(a,b)
  196. {
  197.     var temp;
  198.     for(var j=1; j<a.length; j++) {
  199.         for(var i=0; i<j; i++) {
  200.             if( a[i] < a[j] ) {    
  201.                 temp = a[j];a[j] = a[i];a[i] = temp;
  202.                 temp = b[j];b[j] = b[i];b[i] = temp;
  203.             }
  204.         }
  205.     }
  206. }
  207. //---------------------------------------------------
  208. function buildHtmlResultsStr()
  209. {
  210.     var innerHTMLstring,ndxEnd;
  211.  
  212.     // Gather all of the results display lines into the 'resultsArr'
  213.         ndxEnd = (matchesArrIndices.length > maxNumberOfShownSearchHits ) ? maxNumberOfShownSearchHits : matchesArrIndices.length;
  214.  
  215.         for(var ndx=0, resultsArr = new Array(); ndx < ndxEnd; ndx++) {
  216.             resultsArr[resultsArr.length] = buildResultsStrOneLine(matchesArrIndices[ndx],matchesArrHits[ndx]);
  217.         }
  218.  
  219.     // Convert this 'resultsArr' into a single string that will be injected into this search page.
  220.         innerHTMLstring = "";
  221.         for( var ndx=0; ndx < resultsArr.length; ndx++ ) {
  222.             innerHTMLstring = innerHTMLstring + resultsArr[ndx];
  223.         }
  224.     return innerHTMLstring;
  225. }
  226. //---------------------------------------------------
  227. function buildResultsStrOneLine(a,b)
  228. {
  229.     var retStr;
  230.     retStr = "<p class=\"searchresults\"><a href=\"" + top.fileArr[a] + ".html\"";
  231.  
  232.     // for debug...
  233.     //retStr += "target=\"content\" ";
  234.     //retStr += "title=\"" + top.fileArr[a] + ".html-";
  235.     //retStr += a + "-" + b + "\">";
  236.  
  237.     // for production...
  238.     retStr += "target=\"content\" >";
  239.  
  240.     retStr += top.titleArr[a] + "</a></p>";
  241.     return retStr;
  242. }
  243. //---------------------------------------------------
  244. // checkForHits
  245. //  Break up the search term into words.
  246. //  Check each of those words against...
  247. //        (a) cached titles and 
  248. //        (b) cached content lines 
  249. //  Perform the hit detection for each one, 
  250. //  storing the results into (hits-ordered) 
  251. //        'matchesArrIndices' and 
  252. //        'matchesArrHits'.
  253. //---------------------------------------------------
  254. function checkForHits()
  255. {
  256.     var inputWords = new Array();
  257.     var tempArr = new Array();
  258.  
  259.     // Split the search term into individual search words
  260.         tempArr = searchTerm.split(" ");
  261.         for(var ndx=0; ndx < tempArr.length; ndx++) {
  262.             if( tempArr[ndx].length ) {
  263.                 inputWords[inputWords.length] = tempArr[ndx];
  264.             }
  265.         }
  266.  
  267.     // Initialization
  268.         matchesArrHits = new Array();
  269.         matchesArrIndices = new Array();
  270.  
  271.     // Initialize the 'maskArr' and the 'hitsArr'
  272.         maskArr = new Array();
  273.         hitsArr = new Array();
  274.         for( var ndx = 0; ndx < top.fileArr.length; ndx++ ) {maskArr
  275.             maskArr[maskArr.length] = 1;
  276.             hitsArr[hitsArr.length] = 0;
  277.         }
  278.  
  279.     // Do checking for matches on EACH OF THE INPUT WORDS
  280.         for( var ndx = 0; ndx < inputWords.length; ndx++ ) {
  281.  
  282.             // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  283.             if( ! checkForHitsWordAgainstPages( inputWords[ndx] ) ) {
  284.                 return;     // No sense in continuing, match has failed.
  285.             }
  286.             // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  287.  
  288.             for( var ndx2 = 0; ndx2 < hitsArr.length; ndx2++ ) {
  289.                 if( hitsArr[ndx2] == 0 ) {
  290.                     maskArr[ndx2] = 0;
  291.                 }
  292.                 else {
  293.                     if( maskArr[ndx2] != 0 ) {
  294.                         maskArr[ndx2] += hitsArr[ndx2];
  295.                     }
  296.                 }
  297.             }
  298.         }
  299.  
  300.     // From the final 'maskArr', generate 'matchesArrHits' and 'matchesArrIndices'    
  301.         for( var ndx = 0; ndx < maskArr.length; ndx++ ) {
  302.             if( maskArr[ndx] ) {
  303.                 matchesArrHits[matchesArrHits.length] = maskArr[ndx];
  304.                 matchesArrIndices[matchesArrIndices.length] = ndx;
  305.             }
  306.         }
  307.  
  308.     // If there were any hits, then sort them by highest hits first
  309.         if( matchesArrIndices.length ) {
  310.             bubbleSortWithShadow(matchesArrHits, matchesArrIndices);
  311.         }
  312. }
  313. //---------------------------------------------------
  314. function checkForHitsWordAgainstPages(w)        
  315. {
  316.     var hitAnywhere = 0;
  317.  
  318.     // Process each of the content lines (one per file/page)
  319.         for(var ndx=0; ndx < top.sc2.length; ndx++) {
  320.  
  321.             // Put the cached title into glob_title
  322.                 glob_title = top.sc1[ndx];
  323.  
  324.             // Put the cached content line into glob_phrase
  325.                 glob_phrase = top.sc2[ndx];
  326.                 
  327.             if( maskArr[ndx] ) {
  328.             // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  329.                 if( top.isDblByte ) {
  330.                     hitsArr[ndx] = checkForHitsWordAgainstTitleAndLine2(w,ndx);
  331.                 }
  332.                 else {
  333.                     hitsArr[ndx] = checkForHitsWordAgainstTitleAndLine(w,ndx);
  334.                 }
  335.                 if( hitsArr[ndx] ) {
  336.                     hitAnywhere = 1;
  337.                 }
  338.             // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  339.             }
  340.         }
  341.     return hitAnywhere;
  342. }
  343. //---------------------------------------------------
  344. function checkForHitsWordAgainstTitleAndLine(w, lineNdx)
  345. {
  346.     var words;
  347.     var titleHitCnt = 0;
  348.     var contentHitCnt = 0;
  349.     var regex = new RegExp(w, "i");
  350.  
  351.     // TITLE .........................................
  352.         words = new Array();
  353.         words = glob_title.split(" ");
  354.  
  355.         // EXECUTE TITLE MATCH TEST
  356.         for( var ndx = 0; ndx < words.length; ndx++ ) {
  357.             if( w == words[ndx] ) {
  358.                 titleHitCnt += 100;
  359.                 break;
  360.             }
  361.         }
  362.  
  363.     // CONTENT .........................................
  364.         words = new Array();
  365.         words = glob_phrase.split(" ");
  366.  
  367.         // EXECUTE CONTENT MATCH TEST
  368.         if( regex.test(glob_phrase) ) {    // See if word is anywhere within the phrase first.
  369.             for( var ndx = 0; ndx < words.length; ndx++ ) {
  370.                 if( w == words[ndx] ) {
  371.                     contentHitCnt += getInstanceCount(lineNdx,ndx);
  372.                     break;
  373.                 }
  374.                 else if( w < words[ndx] ) { // If word is greater than the remaining words, leave
  375.                     break;
  376.                 }
  377.             }
  378.         }
  379.  
  380.     return titleHitCnt + contentHitCnt;
  381. }
  382. //---------------------------------------------------
  383. function checkForHitsWordAgainstTitleAndLine2(w, lineNdx)
  384. {
  385.     var titleHitCnt = 0;
  386.     var contentHitCnt = 0;
  387.  
  388.     // TITLE .........................................
  389.         if( glob_title.indexOf(w) != -1 ) {
  390.             titleHitCnt = 100;
  391.         }
  392.  
  393.     // CONTENT .........................................
  394.         contentHitCnt = indexesOf(glob_phrase,w);
  395.  
  396.     return titleHitCnt + contentHitCnt;
  397. }
  398. //---------------------------------------------------
  399. // checkTheInputString
  400. // 
  401. //  returns...
  402. //        empty string - if there is valid input to search
  403. //        message string - if there is NO VALID INPUT to search
  404. //---------------------------------------------------
  405. function checkTheInputString()
  406. {
  407.     var myArr = new Array();
  408.     var tempArr = new Array();
  409.     var foundStopOrShortWord = 0;
  410.     var ptn1 = /\d\D/;
  411.     var ptn2 = /\D\d/;
  412.  
  413.     handleWhitespaceRemoval();
  414.  
  415.     searchTerm = searchTerm.toLowerCase();
  416.  
  417.     searchTerm = filterTheChars(searchTerm);
  418.         
  419.     handleWhitespaceRemoval();
  420.  
  421.     if( searchTerm.length ) {
  422.         
  423.         // Split the searchTerm
  424.             tempArr = searchTerm.split(" ",100);
  425.             if(showInputStringAlerts){alert( "size of tempArr: " + tempArr.length );}
  426.  
  427.         // Handle periods
  428.             for( var ndx = 0; ndx < tempArr.length; ndx++ ) {
  429.                 if( tempArr[ndx].charCodeAt(0) == 46 ) {    // periods at the start of word
  430.                     //tempArr[ndx] = tempArr[ndx].substr(1); // NOTE: We don't want to do this. (e.g. ".txt")
  431.                 }
  432.                 if( tempArr[ndx].charCodeAt(tempArr[ndx].length-1) == 46 ) { // end of word
  433.                     tempArr[ndx] = tempArr[ndx].substr(0,tempArr[ndx].length-1);
  434.                 }
  435.             }
  436.             
  437.         // Do stopwords and shortwords removal
  438.             for( var ndx = 0; ndx < tempArr.length; ndx++ ) {
  439.                 var word = tempArr[ndx];
  440.                 if(showInputStringAlerts){alert( "Checking word: " + word );}
  441.                 
  442.                 if( ! top.sw[word] ) {
  443.                     if( word.length < 2 ) {
  444.                         foundStopOrShortWord = 1;
  445.                     }
  446.                     else if( (word.length > 2) || (ptn1.test(word) || ptn2.test(word)) ) {
  447.                         myArr[myArr.length] = tempArr[ndx];
  448.                     }
  449.                     else {
  450.                         foundStopOrShortWord = 1;
  451.                     }
  452.                 }
  453.                 else {
  454.                     foundStopOrShortWord = 1;
  455.                 }
  456.             }
  457.  
  458.         // Now reconstruct the searchTerm, based upon the 'myArr'
  459.             searchTerm = "";
  460.             for( var ndx = 0; ndx < myArr.length; ndx++ ) {
  461.                 searchTerm = searchTerm + myArr[ndx] + " ";
  462.             }
  463.  
  464.         handleWhitespaceRemoval();
  465.  
  466.         if(showInputStringAlerts){alert( "FINAL SEARCH TERM: *" + searchTerm + "*" );}
  467.             
  468.         if( foundStopOrShortWord && ! searchTerm.length ) {
  469.             return MSG_stopAndShortWords;
  470.         }
  471.         top.srch_input_massaged = searchTerm;
  472.         return "";
  473.     } 
  474.     else {
  475.         return MSG_noSearchTermEntered;
  476.     }
  477. }
  478. //---------------------------------------------------
  479. function checkTheInputString2()        // double-byte version
  480. {
  481.     var tempArr = new Array();
  482.  
  483.     handleWhitespaceRemoval();
  484.  
  485.     if( searchTerm.length ) {
  486.  
  487.         // Split the searchTerm
  488.             tempArr = searchTerm.split(" ",100);
  489.             if(showInputStringAlerts){alert( "number of search terms: " + tempArr.length );}
  490.  
  491.         // Now reconstruct the searchTerm, based upon the 'tempArr'
  492.             searchTerm = "";
  493.             for( var ndx = 0; ndx < tempArr.length; ndx++ ) {
  494.                 searchTerm = searchTerm + tempArr[ndx] + " ";
  495.             }
  496.             handleWhitespaceRemoval();
  497.  
  498. if(showInputStringAlerts){alert( "Massaged search term: " + searchTerm );}
  499.  
  500.         top.srch_input_massaged = searchTerm;
  501.         return "";
  502.     }
  503.     else {
  504.         return MSG_noSearchTermEntered;
  505.     }
  506. }
  507. //---------------------------------------------------
  508. function dispatch() {
  509.     if ( top.frames.length && is_ie && (top.srch_1_shot || top.srch_message.length) ){
  510.         doIEsearch();
  511.     }
  512. }
  513. //---------------------------------------------------
  514. function doIEsearch()
  515. {
  516.     var stStr = "";
  517.     
  518.     document.forms["search"].input.value = top.srch_input_verbatim;
  519.     
  520.     if( top.srch_message.length ) {
  521.         document.all.results.innerHTML = top.srch_message;
  522.         top.srch_message = "";
  523.     }
  524.     else if( top.srch_1_shot ) {
  525.         top.srch_1_shot = 0;
  526.         
  527.         searchTerm = top.srch_input_massaged;
  528.         checkForHits();    // Sets: 'matchesArrIndices' and 'matchesArrHits'
  529.  
  530.         if( matchesArrIndices.length ) {    // If there were matches/hits...
  531.             stStr = "<div class=\"form\">" + MSG_pagesContaining + top.srch_input_massaged + "</div>\n";
  532.             document.all.results.innerHTML = stStr + buildHtmlResultsStr();
  533.         }
  534.         else {
  535.             document.all.results.innerHTML = MSG_noPagesContain + top.srch_input_massaged;
  536.         }
  537.         searching_message.style.visibility="hidden";
  538.     }
  539.     top.srch_input_verbatim = "";
  540. }
  541. //---------------------------------------------------
  542. function doNNsearch()
  543. {
  544.     if( !top.frames.length || !(is_nav4up || is_gecko || is_khtml || is_opera) ) {return;}
  545.     
  546.     var ndxEnd;
  547.  
  548.     document.forms["search"].input.value = top.srch_input_verbatim; //"";
  549.     
  550.     if( top.srch_message.length ) {
  551.         document.write(top.srch_message);
  552.         top.srch_message = "";
  553.     }
  554.     else if( top.srch_1_shot ) {
  555.         top.srch_1_shot = 0;
  556.                 
  557.         searchTerm = top.srch_input_massaged;
  558.  
  559.         checkForHits();
  560.  
  561.         if( matchesArrIndices.length ) {
  562.  
  563.             document.write("<div class=\"form\">" + MSG_pagesContaining + top.srch_input_massaged + "</div>\n");
  564.  
  565.             ndxEnd = (matchesArrIndices.length > maxNumberOfShownSearchHits ) ? maxNumberOfShownSearchHits : matchesArrIndices.length;
  566.  
  567.             for(var ndx=0; ndx < ndxEnd; ndx++) {
  568.                 document.write(buildResultsStrOneLine(matchesArrIndices[ndx],matchesArrHits[ndx]));
  569.             }    
  570.         }
  571.         else {
  572.             document.write(MSG_noPagesContain + top.srch_input_massaged);
  573.         }
  574.         if (is_nav4) {
  575.             document.layers["searching_message"].visibility="hidden";
  576.         }
  577.     }
  578.     top.srch_input_verbatim = "";
  579.     if (is_nav4) {
  580.         window.stop();
  581.     }
  582. }
  583. //---------------------------------------------------
  584. function getInstanceCount( lineIndex, wordIndex )
  585. {
  586.     var instancesStr = top.instances[lineIndex];    // e.g. "1432931"
  587.     var ch = instancesStr.substr(wordIndex,1);
  588.     
  589.     return parseInt(ch);
  590. }
  591. //---------------------------------------------------
  592. function handleWhitespaceRemoval()
  593. {
  594.     var re_1 = /^\s/;
  595.     var re_2 = /\s$/;
  596.     var re_3 = /\s\s/;
  597.     var temp;
  598.  
  599.     // Remove leading whitespace
  600.         while( true ) {
  601.             temp = searchTerm.replace(re_1,"");
  602.             if( temp == searchTerm ) {
  603.                 break;
  604.             }
  605.             searchTerm = temp;
  606.         }
  607.     // Remove trailing whitespace
  608.         while( true ) {
  609.             temp = searchTerm.replace(re_2,"");
  610.             if( temp == searchTerm ) {
  611.                 break;
  612.             }
  613.             searchTerm = temp;
  614.         }
  615.     // Replace multiple contiguous spaces with a single space
  616.         while( searchTerm.search(re_3) != -1 ) {
  617.             temp = searchTerm.replace(re_3," ");
  618.             searchTerm = temp;
  619.         }
  620. }
  621. //--------------------------------------------------
  622. function isAcceptableChar(chrNdx)
  623. {
  624.     var acceptableChars = new Array( 32, 46, 95 );    // space, period, underscore
  625.     
  626.     for( var ndx = 0; ndx < acceptableChars.length; ndx++ ) {
  627.         if( chrNdx == acceptableChars[ndx] ) {
  628.             return true;
  629.         }
  630.     }
  631.     return false;
  632. }
  633. //--------------------------------------------------
  634. function indexesOf(str,ptn)
  635. {
  636.     var position = 0;
  637.     var hits = -1;
  638.     var start = -1;
  639.  
  640.     while( position != -1 ) {
  641.         position = str.indexOf(ptn, start+1);
  642.         hits += 1;
  643.         start = position;
  644.     }
  645.     return hits;
  646. }
  647. //--------------------------------------------------
  648. function filterTheChars(line)
  649. {
  650.     var retStr = "",tempStr;
  651.     var ch, chCode, retChr;
  652.     var ndx;
  653.     
  654.     for( ndx = 0; ndx < line.length; ndx++ ) {
  655.         ch = line.substr(ndx,1);
  656.         chCode = ch.charCodeAt(0);
  657.         
  658.         
  659.             if( (chCode >= 192) && (chCode <= 221) ) {    // Handle capital upper-ASCII characters
  660.                 chCode = chCode + 32;
  661.                 retChr = ASCII_to_char(chCode);
  662.             }
  663.             else if( withinAcceptableRanges(chCode) || isAcceptableChar(chCode) ) { // Acceptable characters
  664.                 retChr = ch;
  665.             }
  666.             else {
  667.                 tempStr = isLigatureChar(chCode);
  668.  
  669.                 if( tempStr.length ) {    // Handle ligature-style replacements
  670.                     retChr = tempStr;
  671.                 }
  672.                 else {        // Turn all else into space    
  673.                     retChr = " ";
  674.                 }
  675.             }
  676.  
  677.         // Grow the return string
  678.             retStr += retChr;
  679.     }
  680.     
  681.     return retStr;
  682. }
  683. //--------------------------------------------------
  684. function isLigatureChar(codeToCheck) {
  685.     var xlatTblNdx, code, replStr = "";
  686.  
  687.     for( xlatTblNdx = 0; xlatTblNdx < upperAsciiXlatTbl.length; xlatTblNdx+=2 ) {
  688.  
  689.         code = upperAsciiXlatTbl[xlatTblNdx];
  690.         if( code == codeToCheck ) {
  691.             replStr = upperAsciiXlatTbl[xlatTblNdx+1];
  692.             break;
  693.         }
  694.     }
  695.     
  696.     return replStr;
  697. }
  698. //--------------------------------------------------
  699. function respondToSearchButton() 
  700. {
  701.     var myStr;
  702.     
  703.     top.srch_input_verbatim = document.forms["search"].input.value;
  704.     searchTerm = document.forms["search"].input.value;
  705.     
  706.     if( top.isDblByte ) {
  707.         myStr = checkTheInputString2();
  708.     }
  709.     else {
  710.         myStr = checkTheInputString();    
  711.     }
  712.     
  713.     top.srch_message = myStr;
  714.     top.srch_1_shot = top.srch_message.length ? 0 : 1;
  715.     
  716.     if( (! myStr.length) && (! top.didDbLoad) ) {
  717.         document.location = "srch_fset.html";
  718.     }
  719.     else {
  720.         document.location = "search.html";
  721.     }
  722. }
  723. //---------------------------------------------------
  724. function strReplace(orig,src,dest)
  725. {
  726.     var startPos=0;
  727.     var matchPos = orig.indexOf(src,startPos);
  728.     var retLine="";
  729.     
  730.     while(matchPos != -1) {
  731.         retLine = retLine + orig.substring(startPos,matchPos) + dest;
  732.         startPos = matchPos+1;
  733.         matchPos = orig.indexOf(src,startPos);
  734.     }
  735.     if(! retLine.length) {return orig;}
  736.     else {return retLine+orig.substring(startPos,orig.length);}
  737. }
  738. //--------------------------------------------------
  739. function withinAcceptableRanges(chrNdx)
  740. {    
  741.     var acceptableRanges = new Array( "48-57","65-90","97-122","224-229","231-239","241-246","248-253","255-255");
  742.     
  743.     for( var ndx = 0; ndx < acceptableRanges.length; ndx++ ) {
  744.         var start_finish = new Array();
  745.  
  746.         start_finish = acceptableRanges[ndx].split("-");
  747.         
  748.         if( (chrNdx >= start_finish[0]) && (chrNdx <= start_finish[1]) ) {
  749.             return true;
  750.         }
  751.     }
  752.     return false;
  753. }
  754. //--------------------------------------------------
  755. function ASCII_to_char(num_in)
  756. {
  757.     var str_out = "";
  758.     var num_out = parseInt(num_in);
  759.     
  760.     num_out = unescape('%' + num_out.toString(16));
  761.     str_out += num_out;
  762.     
  763.     return unescape(str_out);
  764. }
  765. //--------------------------------------------------
  766. function writeNavigationCSS()
  767. {
  768.     if (is_gecko || is_khtml || (is_mac && is_ie5up) || is_ie6up)
  769.     {
  770.         document.write("<link href=\"navigation.css\" rel=\"stylesheet\" type=\"text/css\" />")
  771.     }
  772.     else
  773.     {
  774.         document.write("<link href=\"navigation_nav4.css\" rel=\"stylesheet\" type=\"text/css\" />")
  775.     }
  776. }
  777. //--------------------------------------------------
  778. function writeContentCSS()
  779. {
  780.     if (is_gecko || is_khtml || (is_mac && is_ie5up) || is_ie6up)
  781.     {
  782.         document.write("<link href=\"content.css\" rel=\"stylesheet\" type=\"text/css\" />")
  783.     }
  784.     else
  785.     {
  786.         document.write("<link href=\"content_nav4.css\" rel=\"stylesheet\" type=\"text/css\" />")
  787.     }
  788. }
  789.  
  790. //
  791. // JavaScript Browser Sniffer
  792. // Eric Krok, Andy King, Michel Plungjan Jan. 31, 2002
  793. // see http://www.webreference.com/ for more information
  794. //
  795. // This program is free software; you can redistribute it and/or modify
  796. // it under the terms of the GNU General Public License as published by
  797. // the Free Software Foundation; either version 2 of the License, or
  798. //  (at your option) any later version.
  799. //
  800. // please send any improvements to aking@internet.com and we'll
  801. // roll the best ones in
  802. //
  803. // adapted from Netscape's Ultimate client-side JavaScript client sniffer
  804. // and andy king's sniffer
  805. // Revised May 7 99 to add is.nav5up and is.ie5up (see below). (see below).
  806. // Revised June 11 99 to add additional props, checks
  807. // Revised June 23 99 added screen props - gecko m6 doesn't support yet - abk
  808. //                    converted to var is_ from is object to work everywhere
  809. // 990624 - added cookie forms links frames checks - abk
  810. // 001031 - ie4 mod 5.0 -> 5. (ie5.5 mididentified - abk)
  811. //          is_ie4 mod tp work with ie6+ - abk
  812. // 001120 - ns6 released, document.layers false, put back in
  813. //        - is_nav6 test added - abk
  814. // 001121 - ns6+ added, used document.getElementById, better test, dom-compl
  815. // 010117 - actual version for ie3-5.5 by Michel Plungjan
  816. // 010118 - actual version for ns6 by Michel Plungjan
  817. // 010217 - netscape 6/mz 6 ie5.5 onload defer bug docs - abk
  818. // 011107 - added is_ie6 and is_ie6up variables - dmr
  819. // 020128 - added link to netscape's sniffer, on which this is based - abk
  820. //          updated sniffer for aol4-6, ie5mac = js1.4, TVNavigator, AOLTV,
  821. //          hotjava
  822. // 020131 - cleaned up links, added more links to example object detection
  823. // 020131 - a couple small problems with Opera detection. First, when Opera
  824. //          is set to be compatible with other browsers it will contain their
  825. //          information in the userAgent strings. Thus, to be sure we have 
  826. //          Opera we should check for it before checking for the other bigs.
  827. //          (And make sure the others are !opera.) Also corrected a minor
  828. //          bug in the is_opera6up assignment.
  829. // 020214 - Added link for Opera/JS compatibility; added improvements for 
  830. //          windows xp/2000 id in opera and aol 7 id (thanks to Les
  831. //          Hill, Les.Hill@getronics.com, for the suggestion).
  832. // 020531 - Added N6/7 and moz identifiers. 
  833. // 020605 - Added mozilla guessing, Netscape 7 identification, and cleaner
  834. //          identification for Netscape 6. (this comment added after code 
  835. //          changes)
  836. // 020725 - Added is_gecko. -- dmr
  837. // 021205 - Added is_Flash and is_FlashVersion, based on Doc JavaScript code. 
  838. //          Added Opera 7 variables. -- dmr
  839. // 021209 - Added aol8. -- dmr
  840. // 030110 - Added is_safari, added 1.5 js designation for Opera 7. --dmr
  841. // 030128 - Added is_konq, per user suggestion (thanks to Sam Vilain).
  842. //          Removed duplicate Opera checks left over after last revision. - dmr
  843. //
  844. // Everything you always wanted to know about your JavaScript client
  845. // but were afraid to ask. Creates "is_" variables indicating:
  846. // (1) browser vendor:
  847. //     is_nav, is_ie, is_opera
  848. // (2) browser version number:
  849. //     is_major (integer indicating major version number: 2, 3, 4 ...)
  850. //     is_minor (float   indicating full  version number: 2.02, 3.01, 4.04 ...)
  851. // (3) browser vendor AND major version number
  852. //     is_nav2, is_nav3, is_nav4, is_nav4up, is_nav5, is_nav5up, 
  853. //     is_nav6, is_nav6up, is_ie3, is_ie4, is_ie4up, is_ie5up, is_ie6...
  854. // (4) JavaScript version number:
  855. //     is_js (float indicating full JavaScript version number: 1, 1.1, 1.2 ...)
  856. // (5) OS platform and version:
  857. //     is_win, is_win16, is_win32, is_win31, is_win95, is_winnt, is_win98
  858. //     is_os2
  859. //     is_mac, is_mac68k, is_macppc
  860. //     is_unix
  861. //        is_sun, is_sun4, is_sun5, is_suni86
  862. //        is_irix, is_irix5, is_irix6
  863. //        is_hpux, is_hpux9, is_hpux10
  864. //        is_aix, is_aix1, is_aix2, is_aix3, is_aix4
  865. //        is_linux, is_sco, is_unixware, is_mpras, is_reliant
  866. //        is_dec, is_sinix, is_freebsd, is_bsd
  867. //     is_vms
  868. //
  869. // based in part on 
  870. // http://www.mozilla.org/docs/web-developer/sniffer/browser_type.html
  871. // The Ultimate JavaScript Client Sniffer
  872. // and Andy King's object detection sniffer
  873. //
  874. // Note: you don't want your Nav4 or IE4 code to "turn off" or
  875. // stop working when Nav5 and IE5 (or later) are released, so
  876. // in conditional code forks, use is_nav4up ("Nav4 or greater")
  877. // and is_ie4up ("IE4 or greater") instead of is_nav4 or is_ie4
  878. // to check version in code which you want to work on future
  879. // versions. For DOM tests scripters commonly used the 
  880. // is_getElementById test, but make sure you test your code as
  881. // filter non-compliant browsers (Opera 5-6 for example) as some 
  882. // browsers return true for this test, and don't fully support
  883. // the W3C's DOM1.
  884. //
  885.  
  886.     // convert all characters to lowercase to simplify testing
  887.     var agt=navigator.userAgent.toLowerCase();
  888.     var appVer = navigator.appVersion.toLowerCase();
  889.  
  890.     // *** BROWSER VERSION ***
  891.  
  892.     var is_minor = parseFloat(appVer);
  893.     var is_major = parseInt(is_minor);
  894.  
  895.     var is_opera = (agt.indexOf("opera") != -1);
  896.     var is_opera2 = (agt.indexOf("opera 2") != -1 || agt.indexOf("opera/2") != -1);
  897.     var is_opera3 = (agt.indexOf("opera 3") != -1 || agt.indexOf("opera/3") != -1);
  898.     var is_opera4 = (agt.indexOf("opera 4") != -1 || agt.indexOf("opera/4") != -1);
  899.     var is_opera5 = (agt.indexOf("opera 5") != -1 || agt.indexOf("opera/5") != -1);
  900.     var is_opera6 = (agt.indexOf("opera 6") != -1 || agt.indexOf("opera/6") != -1); // new 020128- abk
  901.     var is_opera7 = (agt.indexOf("opera 7") != -1 || agt.indexOf("opera/7") != -1); // new 021205- dmr
  902.     var is_opera5up = (is_opera && !is_opera2 && !is_opera3 && !is_opera4);
  903.     var is_opera6up = (is_opera && !is_opera2 && !is_opera3 && !is_opera4 && !is_opera5); // new020128
  904.     var is_opera7up = (is_opera && !is_opera2 && !is_opera3 && !is_opera4 && !is_opera5 && !is_opera6); // new021205 -- dmr
  905.  
  906.     // Note: On IE, start of appVersion return 3 or 4
  907.     // which supposedly is the version of Netscape it is compatible with.
  908.     // So we look for the real version further on in the string
  909.  
  910.     var iePos  = appVer.indexOf('msie');
  911.     if (iePos !=-1) {
  912.        is_minor = parseFloat(appVer.substring(iePos+5,appVer.indexOf(';',iePos)))
  913.        is_major = parseInt(is_minor);
  914.     }
  915.  
  916.     // ditto Konqueror
  917.                                       
  918.     var is_konq = false;
  919.     var kqPos   = agt.indexOf('konqueror');
  920.     if (kqPos !=-1) {                 
  921.        is_konq  = true;
  922.        is_minor = parseFloat(agt.substring(kqPos+10,agt.indexOf(';',kqPos)));
  923.        is_major = parseInt(is_minor);
  924.     }                                 
  925.  
  926.     var is_getElementById   = (document.getElementById) ? "true" : "false"; // 001121-abk
  927.     var is_getElementsByTagName = (document.getElementsByTagName) ? "true" : "false"; // 001127-abk
  928.     var is_documentElement = (document.documentElement) ? "true" : "false"; // 001121-abk
  929.  
  930.     var is_safari = ((agt.indexOf('safari')!=-1)&&(agt.indexOf('mac')!=-1))?true:false;
  931.     var is_khtml  = (is_safari || is_konq);
  932.  
  933.     var is_gecko = ((!is_khtml)&&(navigator.product)&&(navigator.product.toLowerCase()=="gecko"))?true:false;
  934.     var is_gver  = 0;
  935.     if (is_gecko) is_gver=navigator.productSub;
  936.  
  937.     var is_moz   = ((agt.indexOf('mozilla/5')!=-1) && (agt.indexOf('spoofer')==-1) &&
  938.                     (agt.indexOf('compatible')==-1) && (agt.indexOf('opera')==-1)  &&
  939.                     (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1)     &&
  940.                     (is_gecko) && 
  941.                     ((navigator.vendor=="")||(navigator.vendor=="Mozilla")));
  942.     if (is_moz) {
  943.        var is_moz_ver = (navigator.vendorSub)?navigator.vendorSub:0;
  944.        if(!(is_moz_ver)) {
  945.            is_moz_ver = agt.indexOf('rv:');
  946.            is_moz_ver = agt.substring(is_moz_ver+3);
  947.            is_paren   = is_moz_ver.indexOf(')');
  948.            is_moz_ver = is_moz_ver.substring(0,is_paren);
  949.        }
  950.        is_minor = is_moz_ver;
  951.        is_major = parseInt(is_moz_ver);
  952.     }
  953.  
  954.     var is_nav  = ((agt.indexOf('mozilla')!=-1) && (agt.indexOf('spoofer')==-1)
  955.                 && (agt.indexOf('compatible') == -1) && (agt.indexOf('opera')==-1)
  956.                 && (agt.indexOf('webtv')==-1) && (agt.indexOf('hotjava')==-1)
  957.                 && (!is_khtml) && (!(is_moz)));
  958.  
  959.     // Netscape6 is mozilla/5 + Netscape6/6.0!!!
  960.     // Mozilla/5.0 (Windows; U; Win98; en-US; m18) Gecko/20001108 Netscape6/6.0
  961.     // Changed this to use navigator.vendor/vendorSub - dmr 060502   
  962.     // var nav6Pos = agt.indexOf('netscape6');
  963.     // if (nav6Pos !=-1) {
  964.     if ((navigator.vendor)&&
  965.         ((navigator.vendor=="Netscape6")||(navigator.vendor=="Netscape"))&&
  966.         (is_nav)) {
  967.        is_major = parseInt(navigator.vendorSub);
  968.        // here we need is_minor as a valid float for testing. We'll
  969.        // revert to the actual content before printing the result. 
  970.        is_minor = parseFloat(navigator.vendorSub);
  971.     }
  972.  
  973.     var is_nav2 = (is_nav && (is_major == 2));
  974.     var is_nav3 = (is_nav && (is_major == 3));
  975.     var is_nav4 = (is_nav && (is_major == 4));
  976.     var is_nav4up = (is_nav && is_minor >= 4);  // changed to is_minor for
  977.                                                 // consistency - dmr, 011001
  978.     var is_navonly      = (is_nav && ((agt.indexOf(";nav") != -1) ||
  979.                           (agt.indexOf("; nav") != -1)) );
  980.  
  981.     var is_nav6   = (is_nav && is_major==6);    // new 010118 mhp
  982.     var is_nav6up = (is_nav && is_minor >= 6) // new 010118 mhp
  983.  
  984.     var is_nav5   = (is_nav && is_major == 5 && !is_nav6); // checked for ns6
  985.     var is_nav5up = (is_nav && is_minor >= 5);
  986.  
  987.     var is_nav7   = (is_nav && is_major == 7);
  988.     var is_nav7up = (is_nav && is_minor >= 7);
  989.  
  990.     var is_ie   = ((iePos!=-1) && (!is_opera) && (!is_khtml));
  991.     var is_ie3  = (is_ie && (is_major < 4));
  992.  
  993.     var is_ie4   = (is_ie && is_major == 4);
  994.     var is_ie4up = (is_ie && is_minor >= 4);
  995.     var is_ie5   = (is_ie && is_major == 5);
  996.     var is_ie5up = (is_ie && is_minor >= 5);
  997.     
  998.     var is_ie5_5  = (is_ie && (agt.indexOf("msie 5.5") !=-1)); // 020128 new - abk
  999.     var is_ie5_5up =(is_ie && is_minor >= 5.5);                // 020128 new - abk
  1000.     
  1001.     var is_ie6   = (is_ie && is_major == 6);
  1002.     var is_ie6up = (is_ie && is_minor >= 6);
  1003.  
  1004. // KNOWN BUG: On AOL4, returns false if IE3 is embedded browser
  1005.     // or if this is the first browser window opened.  Thus the
  1006.     // variables is_aol, is_aol3, and is_aol4 aren't 100% reliable.
  1007.  
  1008.     var is_aol   = (agt.indexOf("aol") != -1);
  1009.     var is_aol3  = (is_aol && is_ie3);
  1010.     var is_aol4  = (is_aol && is_ie4);
  1011.     var is_aol5  = (agt.indexOf("aol 5") != -1);
  1012.     var is_aol6  = (agt.indexOf("aol 6") != -1);
  1013.     var is_aol7  = ((agt.indexOf("aol 7")!=-1) || (agt.indexOf("aol7")!=-1));
  1014.     var is_aol8  = ((agt.indexOf("aol 8")!=-1) || (agt.indexOf("aol8")!=-1));
  1015.  
  1016.     var is_webtv = (agt.indexOf("webtv") != -1);
  1017.     
  1018.     // new 020128 - abk
  1019.     
  1020.     var is_TVNavigator = ((agt.indexOf("navio") != -1) || (agt.indexOf("navio_aoltv") != -1)); 
  1021.     var is_AOLTV = is_TVNavigator;
  1022.  
  1023.     var is_hotjava = (agt.indexOf("hotjava") != -1);
  1024.     var is_hotjava3 = (is_hotjava && (is_major == 3));
  1025.     var is_hotjava3up = (is_hotjava && (is_major >= 3));
  1026.  
  1027.     // end new
  1028.     
  1029.     // *** JAVASCRIPT VERSION CHECK ***
  1030.     // Useful to workaround Nav3 bug in which Nav3
  1031.     // loads <SCRIPT LANGUAGE="JavaScript1.2">.
  1032.     // updated 020131 by dragle
  1033.     var is_js;
  1034.     if (is_nav2 || is_ie3) is_js = 1.0;
  1035.     else if (is_nav3) is_js = 1.1;
  1036.     else if ((is_opera5)||(is_opera6)) is_js = 1.3; // 020214 - dmr
  1037.     else if (is_opera7up) is_js = 1.5; // 031010 - dmr
  1038.     else if (is_khtml) is_js = 1.5;   // 030110 - dmr
  1039.     else if (is_opera) is_js = 1.1;
  1040.     else if ((is_nav4 && (is_minor <= 4.05)) || is_ie4) is_js = 1.2;
  1041.     else if ((is_nav4 && (is_minor > 4.05)) || is_ie5) is_js = 1.3;
  1042.     else if (is_nav5 && !(is_nav6)) is_js = 1.4;
  1043.     else if (is_hotjava3up) is_js = 1.4; // new 020128 - abk
  1044.     else if (is_nav6up) is_js = 1.5;
  1045.  
  1046.     // NOTE: In the future, update this code when newer versions of JS
  1047.     // are released. For now, we try to provide some upward compatibility
  1048.     // so that future versions of Nav and IE will show they are at
  1049.     // *least* JS 1.x capable. Always check for JS version compatibility
  1050.     // with > or >=.
  1051.  
  1052.     else if (is_nav && (is_major > 5)) is_js = 1.4;
  1053.     else if (is_ie && (is_major > 5)) is_js = 1.3;
  1054.     else if (is_moz) is_js = 1.5;
  1055.     
  1056.     // what about ie6 and ie6up for js version? abk
  1057.     
  1058.     // HACK: no idea for other browsers; always check for JS version 
  1059.     // with > or >=
  1060.     else is_js = 0.0;
  1061.     // HACK FOR IE5 MAC = js vers = 1.4 (if put inside if/else jumps out at 1.3)
  1062.     if ((agt.indexOf("mac")!=-1) && is_ie5up) is_js = 1.4; // 020128 - abk
  1063.     
  1064.     // Done with is_minor testing; revert to real for N6/7
  1065.     if (is_nav6up) {
  1066.        is_minor = navigator.vendorSub;
  1067.     }
  1068.  
  1069.     // *** PLATFORM ***
  1070.     var is_win   = ( (agt.indexOf("win")!=-1) || (agt.indexOf("16bit")!=-1) );
  1071.     // NOTE: On Opera 3.0, the userAgent string includes "Windows 95/NT4" on all
  1072.     //        Win32, so you can't distinguish between Win95 and WinNT.
  1073.     var is_win95 = ((agt.indexOf("win95")!=-1) || (agt.indexOf("windows 95")!=-1));
  1074.  
  1075.     // is this a 16 bit compiled version?
  1076.     var is_win16 = ((agt.indexOf("win16")!=-1) ||
  1077.                (agt.indexOf("16bit")!=-1) || (agt.indexOf("windows 3.1")!=-1) ||
  1078.                (agt.indexOf("windows 16-bit")!=-1) );
  1079.  
  1080.     var is_win31 = ((agt.indexOf("windows 3.1")!=-1) || (agt.indexOf("win16")!=-1) ||
  1081.                     (agt.indexOf("windows 16-bit")!=-1));
  1082.     
  1083.     var is_winme = ((agt.indexOf("win 9x 4.90")!=-1));    // new 020128 - abk
  1084.     var is_win2k = ((agt.indexOf("windows nt 5.0")!=-1) || (agt.indexOf("windows 2000")!=-1)); // 020214 - dmr
  1085.     var is_winxp = ((agt.indexOf("windows nt 5.1")!=-1) || (agt.indexOf("windows xp")!=-1)); // 020214 - dmr
  1086.  
  1087.     // NOTE: Reliable detection of Win98 may not be possible. It appears that:
  1088.     //       - On Nav 4.x and before you'll get plain "Windows" in userAgent.
  1089.     //       - On Mercury client, the 32-bit version will return "Win98", but
  1090.     //         the 16-bit version running on Win98 will still return "Win95".
  1091.     var is_win98 = ((agt.indexOf("win98")!=-1) || (agt.indexOf("windows 98")!=-1));
  1092.     var is_winnt = ((agt.indexOf("winnt")!=-1) || (agt.indexOf("windows nt")!=-1));
  1093.     var is_win32 = (is_win95 || is_winnt || is_win98 ||
  1094.                     ((is_major >= 4) && (navigator.platform == "Win32")) ||
  1095.                     (agt.indexOf("win32")!=-1) || (agt.indexOf("32bit")!=-1));
  1096.  
  1097.     var is_os2   = ((agt.indexOf("os/2")!=-1) ||
  1098.                     (navigator.appVersion.indexOf("OS/2")!=-1) ||
  1099.                     (agt.indexOf("ibm-webexplorer")!=-1));
  1100.  
  1101.     var is_mac    = (agt.indexOf("mac")!=-1);
  1102.     if (is_mac) { is_win = !is_mac; } // dmr - 06/20/2002
  1103.     var is_mac68k = (is_mac && ((agt.indexOf("68k")!=-1) ||
  1104.                                (agt.indexOf("68000")!=-1)));
  1105.     var is_macppc = (is_mac && ((agt.indexOf("ppc")!=-1) ||
  1106.                                 (agt.indexOf("powerpc")!=-1)));
  1107.  
  1108.     var is_sun   = (agt.indexOf("sunos")!=-1);
  1109.     var is_sun4  = (agt.indexOf("sunos 4")!=-1);
  1110.     var is_sun5  = (agt.indexOf("sunos 5")!=-1);
  1111.     var is_suni86= (is_sun && (agt.indexOf("i86")!=-1));
  1112.     var is_irix  = (agt.indexOf("irix") !=-1);    // SGI
  1113.     var is_irix5 = (agt.indexOf("irix 5") !=-1);
  1114.     var is_irix6 = ((agt.indexOf("irix 6") !=-1) || (agt.indexOf("irix6") !=-1));
  1115.     var is_hpux  = (agt.indexOf("hp-ux")!=-1);
  1116.     var is_hpux9 = (is_hpux && (agt.indexOf("09.")!=-1));
  1117.     var is_hpux10= (is_hpux && (agt.indexOf("10.")!=-1));
  1118.     var is_aix   = (agt.indexOf("aix") !=-1);      // IBM
  1119.     var is_aix1  = (agt.indexOf("aix 1") !=-1);
  1120.     var is_aix2  = (agt.indexOf("aix 2") !=-1);
  1121.     var is_aix3  = (agt.indexOf("aix 3") !=-1);
  1122.     var is_aix4  = (agt.indexOf("aix 4") !=-1);
  1123.     var is_linux = (agt.indexOf("inux")!=-1);
  1124.     var is_sco   = (agt.indexOf("sco")!=-1) || (agt.indexOf("unix_sv")!=-1);
  1125.     var is_unixware = (agt.indexOf("unix_system_v")!=-1);
  1126.     var is_mpras    = (agt.indexOf("ncr")!=-1);
  1127.     var is_reliant  = (agt.indexOf("reliantunix")!=-1);
  1128.     var is_dec   = ((agt.indexOf("dec")!=-1) || (agt.indexOf("osf1")!=-1) ||
  1129.            (agt.indexOf("dec_alpha")!=-1) || (agt.indexOf("alphaserver")!=-1) ||
  1130.            (agt.indexOf("ultrix")!=-1) || (agt.indexOf("alphastation")!=-1));
  1131.     var is_sinix = (agt.indexOf("sinix")!=-1);
  1132.     var is_freebsd = (agt.indexOf("freebsd")!=-1);
  1133.     var is_bsd = (agt.indexOf("bsd")!=-1);
  1134.     var is_unix  = ((agt.indexOf("x11")!=-1) || is_sun || is_irix || is_hpux ||
  1135.                  is_sco ||is_unixware || is_mpras || is_reliant ||
  1136.                  is_dec || is_sinix || is_aix || is_linux || is_bsd || is_freebsd);
  1137.  
  1138.     var is_vms   = ((agt.indexOf("vax")!=-1) || (agt.indexOf("openvms")!=-1));
  1139. // additional checks, abk
  1140.     var is_anchors = (document.anchors) ? "true":"false";
  1141.     var is_regexp = (window.RegExp) ? "true":"false";
  1142.     var is_option = (window.Option) ? "true":"false";
  1143.     var is_all = (document.all) ? "true":"false";
  1144. // cookies - 990624 - abk
  1145.     document.cookie = "cookies=true";
  1146.     var is_cookie = (document.cookie) ? "true" : "false";
  1147.     var is_images = (document.images) ? "true":"false";
  1148.     var is_layers = (document.layers) ? "true":"false"; // gecko m7 bug?
  1149. // new doc obj tests 990624-abk
  1150.     var is_forms = (document.forms) ? "true" : "false";
  1151.     var is_links = (document.links) ? "true" : "false";
  1152.     var is_frames = (window.frames) ? "true" : "false";
  1153.     var is_screen = (window.screen) ? "true" : "false";
  1154.  
  1155. // ]]-->
  1156.